# -*- coding: utf-8 -*-
"""
集成学习
Created on Fri Apr 27 21:01:25 2018

@author: Allen
"""
import numpy as np
import matplotlib.pyplot as plt

from sklearn import datasets

X, y = datasets.make_moons( n_samples = 500, noise = 0.3, random_state = 42 )

plt.scatter( X[y==0,0], X[y==0,1] )
plt.scatter( X[y==1,0], X[y==1,1] )
plt.show()

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y )


from sklearn.linear_model import LogisticRegression
log_clf = LogisticRegression()
log_clf.fit( X_train, y_train )
print( log_clf.score( X_test, y_test ) ) # 0.832

from sklearn.svm import SVC
svm_clf = SVC()
svm_clf.fit( X_train, y_train )
print( svm_clf.score( X_test, y_test ) ) # 0.92

from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier()
dt_clf.fit( X_train, y_train )
print( dt_clf.score( X_test, y_test ) ) # 0.864

y_predict1 = log_clf.predict( X_test )
y_predict2 = svm_clf.predict( X_test )
y_predict3 = dt_clf.predict( X_test )

y_predict = np.array( ( y_predict1 + y_predict2 + y_predict3 ) >= 2, dtype = "int" )

from sklearn.metrics import accuracy_score
print( accuracy_score( y_test, y_predict ) ) # 0.936

### 使用Hard Voting Classifier
from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier([
            ( "log_clf", LogisticRegression() ),
            ( "svm_clf", SVC() ),
            ( "dt_clf", DecisionTreeClassifier() )
        ], voting = "hard" )
voting_clf.fit( X_train, y_train )
print( voting_clf.score( X_test, y_test ) ) # 0.896